#ifndef MATRIZ_H_
#define MATRIZ_H_

#include <iostream>
#include <vector>
#include <string.h>
#include <fstream>
#include <dirent.h>
#include <sys/types.h>
#include "../constantes/Constantes.h"
#include "../utiles/StringUtil.h"
#include <stdio.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_linalg.h>


using namespace std;


class Matriz {
public:
	//atributos
	size_t numberRows;
	size_t numberColumns;
	gsl_matrix* matriz;
	//Descomposicion de la matriz A = U.S.Vt
	gsl_matrix* matrizU;
	gsl_matrix* matrizV;
	gsl_vector* vectorS;
	gsl_matrix* matrizS;


	//metodos
	Matriz();
	void setNumberRows(size_t numberRows);
	void setNumberColumns(size_t numberColumns);
	void setMatriz(gsl_matrix* matriz);
	size_t getNumberRows();
	size_t getNumberColumns();
	gsl_matrix* getMatriz();
	void crearMatriz(size_t numberRows,size_t numberColumns);
	void guardarValorByRowColumna(gsl_matrix* matriz,unsigned int indiceRow,unsigned int indiceColumn,double valor);
	void guardarValorByColumnaVector(gsl_vector* vector,unsigned int indiceColumn,double valor);
	double obtenerValorByRowColumna(gsl_matrix* matriz,unsigned int indiceRow,unsigned int indiceColumn);
	double obtenerValorByColumnaVector(gsl_vector* vector,unsigned int indiceColumn);
	void guardarMatrizEnArchivo(gsl_matrix* matriz,string ruta);
	void guardarVectorEnArchivo(gsl_vector* vector,string ruta);
	gsl_matrix* obtenerMatrizDeArchivo(string ruta);
	gsl_vector* obtenerVectorDeArchivo(string ruta);
	void descomponerEnValoresSigulares();
	void reducirDescomposicion(int k);
	gsl_matrix* reducirMatriz(gsl_matrix* matriz,int k);
	gsl_vector* reducirVector(gsl_vector* vector,int k);
	void guardarDecomposicionEnArchivo(string ruta);
	void obtenerDescomposicionDeArchivo(string ruta);
	gsl_matrix* obtenerMatrizDeVector(gsl_vector*vector);
private:
	void obtenerCantidadRowsColumnasMatrizDeArchivo(string ruta,int*row,int*column);
	void obtenerCantidadColumnasVectorDeArchivo(string ruta,int*columns);
};

#endif
